package com.zhu.instructions.stack;

// instructions/stack/SWAP.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：swap
 *
 * 操作数：无
 *
 * 功能：
 *  交换操作数栈顶部的两个变量。
 *  这两个变量必须都是占用一个 slot 的类型（如 int, float, reference）。
 *
 * 栈变化：
 *      ..., value2, value1   →   ..., value1, value2
 *
 * 注意：
 *  - 不可用于 long 或 double 类型（它们占两个 slot）
 *  - JVM 字节码验证器会确保不会对双 slot 值使用 swap
 *
 * 示例场景：
 *  表达式求值中调整操作数顺序，例如：
 *      iconst_1        // 栈: [1]
 *      iconst_2        // 栈: [1, 2]
 *      swap            // 栈: [2, 1] —— 2 成为新栈顶
 *      isub            // 计算 2 - 1 = 1
 */
public class SWAP extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();

        // 弹出栈顶两个值
        Slot slot1 = stack.popSlot();  // value1（原栈顶）
        Slot slot2 = stack.popSlot();  // value2（原次栈顶）

        // 逆序压回：先压 value1，再压 value2 → 实现交换
        stack.pushSlot(slot1);         // 压入原栈顶（value1）
        stack.pushSlot(slot2);         // 压入原次栈顶（value2）

        // 结果：栈顶变为 value2，次栈顶变为 value1
    }
}
